package dao.jdbc.SqlServer;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Vector;

import dao.intefaces.InterfacePresupuestoDAO;

import entidades.ItemPresupuesto;
import entidades.Presupuesto;

public class PresupuestoDAO implements InterfacePresupuestoDAO{

	private static PresupuestoDAO instancia = null;
	
	public static PresupuestoDAO getInstancia() {
		if (instancia == null){
			instancia = new PresupuestoDAO();
		}
		return instancia;
	}

	public boolean existePresupuesto(int nroPresupuesto) {
		boolean resultadoOperacion = false;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try{
			Connection con = DataSource.obtenerConexion();
			String query = "SELECT * FROM PRESUPUESTO WHERE NROPRESUPUESTO = " + nroPresupuesto;
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()){
				resultadoOperacion = true;
			}
		} catch(Exception e){
			e.printStackTrace();
		} finally {
			DataSource.cerrarConexion(rs, stmt);
		}
		return resultadoOperacion;
	}

	/* Este obtener Presupuesto lo uso SOLO para la agenda */
	/* Posteriormente le agrego el resto de los datos para usarlo en el modificar presupuesto Frame	*/
	public Presupuesto obtenerPresupuesto(int nroPresupuesto) {
		// TODO Auto-generated method stub
		Presupuesto presupuestoBuscado = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "Select * from presupuesto where nroPresupuesto = ?";
			Connection con = DataSource.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, nroPresupuesto);
			rs = stmt.executeQuery();
			if (rs.next()) {
				presupuestoBuscado = new Presupuesto();
				presupuestoBuscado.setNroDocumento(nroPresupuesto);
				presupuestoBuscado.setCliente(ClienteDAO.getInstancia().obtenerCliente(rs.getString("CUIT")));
				presupuestoBuscado.setDiasValides(rs.getInt("validezPresupuesto"));
				presupuestoBuscado.setCondicionPago(rs.getString("condicionPago"));
				presupuestoBuscado.setEstado(obtenerNombreEstado(rs.getInt("nroEstado")));
				presupuestoBuscado.setItemsPresupuesto(obtenerItemsPresupuesto(nroPresupuesto));
				presupuestoBuscado.setTotal(getTotalPresupuesto(nroPresupuesto));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DataSource.cerrarConexion(rs, stmt);
		}
		return presupuestoBuscado;
	}
		
	private float getTotalPresupuesto(int nroPresupuesto) {
		float totalPresupuesto = 0;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			String query =	"select sum(pi.precio * pi.cantidad) as total " + 
							"from precioItem pi inner join presupuesto p on pi.nroPresupuesto = p.nroPresupuesto " + 
							"where p.nroPresupuesto = " + nroPresupuesto + ";";
			Connection con = DataSource.obtenerConexion();
			stmt = con.createStatement();
			rs = stmt.executeQuery(query);
			while (rs.next()) {
				totalPresupuesto = (rs.getFloat("total"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DataSource.cerrarConexion(rs, stmt);
		}
		return totalPresupuesto;
	}

	private Vector<ItemPresupuesto> obtenerItemsPresupuesto(int nroPresupuesto) {
		// TODO Auto-generated method stub
		Vector<ItemPresupuesto> listadoItems = new Vector<ItemPresupuesto>();
		Statement stmt = null;
		ResultSet rs = null;
		try {
			String query = 	"select pi.* " + 
							"from precioItem pi inner join presupuesto p on pi.nroPresupuesto = p.nroPresupuesto " +
							"where p.nroPresupuesto = " + nroPresupuesto + ";";
			Connection con = DataSource.obtenerConexion();
			stmt = con.createStatement();
			rs = stmt.executeQuery(query);
			while (rs.next()) {
				ItemPresupuesto item = new ItemPresupuesto();
				item.setCantidad(rs.getInt("cantidad"));
				item.setDescripcion(rs.getString("descripcion"));
				item.setNroItem(rs.getInt("nroItem"));
				item.setPrecio(rs.getFloat("precio"));
				item.setTipoServicio(getNombreTipoServicio(rs.getInt("nroTipoServicio")));
				listadoItems.add(item);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DataSource.cerrarConexion(rs, stmt);
		}
		return listadoItems;
	}
	
	private String getNombreTipoServicio(int nroTipo)
	{
		String nombreTipoServicio = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT * FROM tipoServicio WHERE nroTipoServicio = " + nroTipo + ";";
			Connection con = DataSource.obtenerConexion();
			stmt = con.createStatement();
			rs = stmt.executeQuery(query);
			while (rs.next()) {
				nombreTipoServicio = (rs.getString("descripcion"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DataSource.cerrarConexion(rs, stmt);
		}
		return nombreTipoServicio;
	}

	private String obtenerNombreEstado(int nroEstado)
	{
		String nombreEstado = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT descripcion FROM estadoPresupuesto WHERE nroEstado = " + nroEstado + ";";
			Connection con = DataSource.obtenerConexion();
			stmt = con.createStatement();
			rs = stmt.executeQuery(query);
			while (rs.next()) {
				nombreEstado = (rs.getString("descripcion"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DataSource.cerrarConexion(rs, stmt);
		}
		return nombreEstado;
	}
	
	public Vector<String> obtenerTiposServicio() {
		Vector<String> tiposServicio = new Vector<String>();
		Statement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT * FROM TIPOSERVICIO";
			Connection con = DataSource.obtenerConexion();
			stmt = con.createStatement();
			rs = stmt.executeQuery(query);
			while (rs.next()) {
				tiposServicio.addElement(rs.getString("descripcion"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DataSource.cerrarConexion(rs, stmt);
		}
		return tiposServicio;
	}
	
	private int obtenerNroTipoServicio(String tipoServicio){
		int nroTipoServicio = 0;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT NROTIPOSERVICIO FROM TIPOSERVICIO WHERE DESCRIPCION = '" + tipoServicio + "';";
			Connection con = DataSource.obtenerConexion();
			stmt = con.createStatement();
			rs = stmt.executeQuery(query);
			while (rs.next()) {
				nroTipoServicio = rs.getInt("NROTIPOSERVICIO");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DataSource.cerrarConexion(rs, stmt);
		}
		return nroTipoServicio;
	}

	@Override
	public void agregarPrespuesto(Presupuesto nuevoPresupuesto) {
		// TODO Auto-generated method stub
		PreparedStatement stmt = null;
		try{
			@SuppressWarnings("deprecation")
			String query = "INSERT INTO PRESUPUESTO VALUES (?,?,?,?," + "'" +nuevoPresupuesto.getFechaEmision().getTime().toLocaleString() + "'" + ",?)";
			Connection conexion = DataSource.obtenerConexion();
			conexion.setAutoCommit(false);
			stmt = conexion.prepareStatement(query);
			stmt.setInt(1, nuevoPresupuesto.getNroDocumento());
			stmt.setString(2, nuevoPresupuesto.getCliente().getCuit());
			stmt.setInt(3, nuevoPresupuesto.getDiasValidez());
			stmt.setString(4, nuevoPresupuesto.getCondicionPago());
			stmt.setInt(5, obtenerEstadoPresupuesto(nuevoPresupuesto.getEstado()));
			stmt.execute();
			conexion.commit();
		}catch(Exception e){
			DataSource.rollback();
			e.printStackTrace();
		}finally{
			DataSource.cerrarConexion(stmt);
		}
		System.out.println("Cargo los items");
		agregarItemsPresupuesto(nuevoPresupuesto);
	}
	
	private void agregarItemsPresupuesto(Presupuesto presupuesto){
		Vector<ItemPresupuesto> listadoItems = presupuesto.getItemsPresupuesto();
		PreparedStatement stmt = null;
		try{
			for(int i = 0; i < listadoItems.size(); i++){
				String query = "INSERT INTO PRECIOITEM VALUES (?,?,?,?,?,?,?,?,?)";
				Connection conexion = DataSource.obtenerConexion();
				conexion.setAutoCommit(false);
				stmt = conexion.prepareStatement(query);
				stmt.setInt(1, listadoItems.elementAt(i).getNroItem());
				stmt.setInt(2, presupuesto.getNroDocumento());
				stmt.setString(3, null);
				stmt.setString(4, null);
				stmt.setString(5, null);
				stmt.setInt(6, obtenerNroTipoServicio(listadoItems.elementAt(i).getTipoServicio()));
				stmt.setString(7, listadoItems.elementAt(i).getDescripcion());
				stmt.setFloat(8, listadoItems.elementAt(i).getPrecio());
				stmt.setInt(9, listadoItems.elementAt(i).getCantidad());
				stmt.execute();
				conexion.commit();
			}
		}catch(Exception e){
			DataSource.rollback();
			e.printStackTrace();
		}finally{
			DataSource.cerrarConexion(stmt);
		}
	}
	
	private int obtenerEstadoPresupuesto(String estadoPresupuesto){
		// TODO Auto-generated method stub
		int nroEstado = 0;
		PreparedStatement stmt = null;
		ResultSet resultSet = null;
		try{
			Connection conexion = DataSource.obtenerConexion();
			String query = "SELECT NROESTADO FROM ESTADOPRESUPUESTO WHERE DESCRIPCION =" + "\'" + estadoPresupuesto +" \'";
			stmt = conexion.prepareStatement(query);
			resultSet = stmt.executeQuery();
			while (resultSet.next()){
				nroEstado = resultSet.getInt("nroEstado");
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			DataSource.cerrarConexion(resultSet, stmt);
		}
		return nroEstado;
	}

	@Override
	public Vector<String> obtenerEstadosPresupuestos() {
		Vector<String> estadosPresupuestos = new Vector<String>();
		Statement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT * FROM ESTADOPRESUPUESTO";
			Connection con = DataSource.obtenerConexion();
			stmt = con.createStatement();
			rs = stmt.executeQuery(query);
			while (rs.next()) {
				String estado = new String(rs.getString("descripcion"));
				estadosPresupuestos.add(estado);
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			DataSource.cerrarConexion(rs, stmt);
		}
		return estadosPresupuestos;
	}

	@Override
	public void modificarEstadoPresupuesto(Presupuesto presupuesto,
			String nuevoEstado) {
		// TODO Auto-generated method stub
		PreparedStatement stmt = null;
		try{
			Connection conexion = DataSource.obtenerConexion();
			String query = "UPDATE presupuesto SET nroEstado = ? WHERE nroPresupuesto = " + presupuesto.getNroDocumento() + ";";
			conexion.setAutoCommit(false);
			stmt = conexion.prepareStatement(query);
			stmt.setInt(1, obtenerEstadoPresupuesto(nuevoEstado));
			stmt.execute();
			conexion.commit();
		}catch(Exception e){
			DataSource.rollback();
			e.printStackTrace();
		}finally{
			DataSource.cerrarConexion(stmt);
		}
	}

}
